// 测试深拷贝浅拷贝
// let arr = ['a', 'b', 'c', { a: 1, b: 2, c: { c: 3 } }]
// let copyArr = [...arr]

// console.log(copyArr === arr)
// console.log(copyArr[3] === arr[3])

// 原始类型：string,number,bool,undefined,null,
// 引用类型：object (arrary,date,func,etc.)
// let obj = {
//   a: 'string',
//   b: 22,
//   c: true,
//   d: undefined,
//   e: null,
//   f: { fa: 'fa' },
//   arr: [1, 2, '3'],
//   date: new Date(),
// }
// let newObj = { ...obj }
// console.log(obj === { ...obj })
// obj.a = 'aaaa'
// obj.b = 33
// obj.c = false
// obj.d = null
// obj.e = undefined
// obj.f.fa = 'new fa'
// obj.arr[2] = '5'
// obj.date.setDate(obj.date.getDate() + 7)
// console.log(obj, newObj)

// let newArr = arr.map((item) => item)
// console.log(newArr === arr)
// console.log(newArr[3] === arr[3])

// let obj = Object.assign({}, arr[3])
// console.log(obj === arr[3])
// console.log(obj.c === arr[3].c)

// let newArr = JSON.parse(JSON.stringify(arr))
// console.log(newArr)
// console.log(newArr === arr)
// console.log(newArr[3] === arr[3])
// console.log(newArr[3].c === arr[3].c)

// let obj = {
//   [{
//     objKey: 'objKeyValue',
//     toString() {
//       return 'objKeyValueToString'
//     },
//   }]: 'objValue',
//   a: 'a',
// }
// console.log(obj)
// console.log(Object.keys(obj))
// console.log(obj['objKeyValueToString'])
// console.log(
//   obj[
//     {
//       objKey: 'objKeyValue',
//       toString() {
//         return 'objKeyValueToString'
//       },
//     }
//   ]
// )

// let map = new Map([
//   ['a', 'aaa'],
//   ['b', 'bbb'],
// ])
// let c = { c: 'ccc' }
// map.set(c, 'cccc')
// let obj = {
//   key: 'vlaue',
//   toString() {
//     return 'aa'
//   },
// }
// map[obj] = 'objValue'
// console.log(map)
// console.log(Object.keys(map))
// console.log(map[obj])
// console.log(map.get('a'))
// console.log(map.get(c))

// let todos = {
//   life: ['吃饭', '睡觉', '运动', '旅游'],
//   learn: ['语文', '数学', '物理', '体育'],
//   work: ['划水'],

//   [Symbol.iterator]: function* () {
//     let all = [...this.life, ...this.learn, ...this.work]
//     for (let i = 0, n = all.length; i < n; i++) {
//       yield all[i]
//     }
//   },
// }

// for (const item of todos) {
//   console.log(item)
// }

// function* foo() {
//   console.log('gen')
//   let r = yield 100
//   return r
// }

// function run(gen) {
//   let g = gen()
//   let b = g.next()
//   while (true) {
//     console.log(b)
//     b = g.next(b.value * 10)
//     if (!b.value && b.done) break
//   }
// }
// run(foo)

// async function t1() {
//   let a = await 'lagou'
//   console.log(a)
// }
// t1() //lagou

// async function t2() {
//   let a = await new Promise((resolve) => {})
//   console.log(a)
// }
// t2() //

// async function t3() {
//   let a = await new Promise((resolve) => {
//     resolve()
//   })
//   console.log(a)
// }
// t3() // undefined

// async function t4() {
//   let a = await new Promise((resolve) => {
//     resolve('hello')
//   })
//   console.log(a)
// }
// t4() // hello

// async function t5() {
//   let a = await new Promise((resolve) => {
//     resolve('hello')
//   }).then(() => {
//     return 'lala'
//   })
//   console.log(a)
// }
// t5() // lala

// async function t6() {
//   let a = await fn6().then((res) => {
//     return res
//   })
//   console.log(a)
// }
// async function fn6() {
//   await new Promise((resolve) => {
//     resolve('lagou')
//   })
// }
// t6() // undefined

// async function t7() {
//   let a = await fn7().then((res) => {
//     return res
//   })
//   console.log(a)
// }
// async function fn7() {
//   await new Promise((resolve, reject) => {
//     resolve('lagou')
//   })
//   return 'lala'
// }
// t7() //lala

// node 环境下的 this 指向
// function foo() {
//   console.log(this)
// }
// foo() // 函数调用，this指向全局对象（globalThis）

// console.log(this) // 指向{}，即module.exports
// console.log(this === module.exports)
